#include "handlejson.h"

HandleJson::HandleJson()
{

}

// 注册
void Login::Handle(const QJsonObject &jsonObj, QTcpSocket *socket)
{
    QSqlDatabase db = InitDatabase::GetInstance();       // 数据库连接初始化

    auto ID = jsonObj["ID"].toString();     // 获取客户端的数据
    qDebug()<<"Login ID:"<<ID;
    QString sql = "SELECT * FROM StuName WHERE ID = '" + ID + "';";  // 查询数据库是否已经存在ID
    qDebug()<<"Login sql:"<<sql;

    QSqlQuery query(db);
    if(!query.exec(sql))
    {
        qDebug()<<"数据库查询失败";
        return;
    }

    if(query.next())    // ID已注册
    {
        QJsonObject jsonObj;
        jsonObj["type"] = LOGIN_ERROR;

        // 将json对象序列化为字节数据 分两步通过socket发送给客户端
        QJsonDocument jsonDoc(jsonObj);
        QByteArray data = jsonDoc.toJson(QJsonDocument::Compact);

        // 发送给客户端
        size_t dataSize = data.size();
        socket->write((const char*)&dataSize, sizeof(size_t));   // 先发送包头
        socket->write(data);                                     // 再发送JSON数据（包体）

        qDebug() << "LOGIN_ERROR data:" << data;
        qDebug() <<"LOGIN_ERROR";
    }
    else    // 未注册
    {
        auto passwd = jsonObj["passwd"].toString();
        qDebug()<<"passwd"<<passwd;
        // 插入新用户到数据库
        QSqlQuery query(db);

        query.prepare("insert into StuName values(:ID,:passwd);");
        query.bindValue(":ID",ID);
        query.bindValue(":passwd",passwd);

        QString pwd = "SELECT * FROM StuName WHERE passwd ='" + passwd + "' ;";

        if(!query.exec())
        {
            qDebug()<<query.lastError()<<endl;
        }
        else    // 注册成功
        {
            QJsonObject jsonObj;
            jsonObj["type"] = LOGIN_SUCCESS;

            // 将json对象序列化为字节数据 分两步通过socket发送给客户端
            QJsonDocument jsonDoc(jsonObj);
            QByteArray data = jsonDoc.toJson(QJsonDocument::Compact);

            // 发送给客户端
            size_t dataSize = data.size();
            socket->write((const char*)&dataSize, sizeof(size_t));   // 先发送包头
            socket->write(data);                                     // 再发送JSON数据（包体）

            qDebug() << "LOGIN_SUCCESS data:" << data;
            qDebug() <<"LOGIN_SUCCESS";
        }
    }
}

// 登录
void Regis::Handle(const QJsonObject &jsonObj, QTcpSocket *socket)
{
    QSqlDatabase db = InitDatabase::GetInstance();       // 数据库连接初始化
    // 提取客户端发来的信息
    auto ID = jsonObj["ID"].toString();
    auto passwd = jsonObj["passwd"].toString();

    // 查询是否有该用户
    QString sql = "SELECT * FROM StuName WHERE ID = '" + ID + "';";
    qDebug()<<"Regis sql:"<<sql;

    qDebug()<<"ID"<<ID;
    qDebug()<<"passwd"<<passwd;

    QSqlQuery query(db);

    if(!query.exec(sql))
    {
        qDebug()<<"查询数据库失败"<<query.lastError().text();
        return;
    }
    if(query.next())    // 验证密码
    {
        QString dbpasswd = query.value("passwd").toString();

        if(dbpasswd == passwd)  // 登录成功
        {
            QString StuID = query.value("ID").toString();
            //创建json对象
            QJsonObject jsonObj;
            jsonObj["type"] = REGIS_SUCCESS;
            jsonObj["ID"] = StuID;

            // 将json对象序列化为字节数据 分两步通过socket发送给客户端
            QJsonDocument jsonDoc(jsonObj);
            QByteArray data = jsonDoc.toJson(QJsonDocument::Compact);

            // 发送给客户端
            size_t dataSize = data.size();
            socket->write((const char*)&dataSize, sizeof(size_t));   // 先发送包头
            socket->write(data);                                     // 再发送JSON数据（包体）

            qDebug() << "REGIS_SUCCESS data:" << data;
            qDebug() <<"REGIS_SUCCESS";
        }
        else    // 登录失败
        {
            QJsonObject jsonObj;
            jsonObj["type"] = REGIS_ERROR;

            // 将json对象序列化为字节数据 分两步通过socket发送给客户端
            QJsonDocument jsonDoc(jsonObj);
            QByteArray data = jsonDoc.toJson(QJsonDocument::Compact);

            // 发送给客户端
            size_t dataSize = data.size();
            socket->write((const char*)&dataSize, sizeof(size_t));   // 先发送包头
            socket->write(data);                                     // 再发送JSON数据（包体）

            qDebug() << "REGIS_ERROR data:" << data;
            qDebug() <<"REGIS_ERROR";
        }
    }
    else    // 登录不成功
    {
        qDebug()<<"用户不存在";
        QJsonObject jsonObj;
        jsonObj["type"] = REGIS_ERROR;

        // 将json对象序列化为字节数据 分两步通过socket发送给客户端
        QJsonDocument jsonDoc(jsonObj);
        QByteArray data = jsonDoc.toJson(QJsonDocument::Compact);

        // 发送给客户端
        size_t dataSize = data.size();
        socket->write((const char*)&dataSize, sizeof(size_t));   // 先发送包头
        socket->write(data);                                     // 再发送JSON数据（包体）

        qDebug() << "REGIS_ERROR data:" << data;
        qDebug() <<"REGIS_ERROR";
    }
}


// 简单工厂
HandleJsonPtr GetHandlePtr(const int& type)
{
    if(type == LOGIN)
    {
        return std::make_shared<Login>();
    }
    if(type == REGIS)
    {
        return std::make_shared<Regis>();
    }

}
